package com.hgw.Demo03_InterpreterPattern.examples;

import java.util.Stack;

/**
 * Data time:2021/12/17 19:43
 * StudentID:2019112118
 * Author:hgw
 * Description: 指令处理类
 */
public class InstructionHandler {
    private AbstractNode node;

    public void handle(String instruction) {
        AbstractNode left = null,right = null;
        AbstractNode direction = null, action = null, distance = null;
        Stack<AbstractNode> stack = new Stack<AbstractNode>();  // 声明一个栈对象用于存储抽象语法树

        String[] words = instruction.split(" ");        // 以空格分隔指令字符串
        for (int i = 0; i < words.length; i++) {
            //  本实例采用栈的方式处理指令，如果遇到"and"，则将其后的3个单词作为3个终结符表达式连成一个简单句子，
            //  SentenceNode作为"and"的右表达式，而将从栈顶弹出的表达式作为"and"的做表达式，最后将新的"and"表达式押入栈中
            if (words[i].equalsIgnoreCase("and")) {
                left = stack.pop();     // 弹出栈顶表达式作为左表达式
                String word1 = words[++i];
                direction = new DirectionNode(word1);
                String word2 = words[++i];
                action = new ActionNode(word2);
                String word3 = words[++i];
                distance = new DistanceNode(word3);
                right = new SentenceNode(direction, action, distance);  // 右表达式
                stack.push(new AndNode(left, right));       // 将新表达式压入栈中
            } else {
                // 如果是从头开始进行解释，则将前3个单词组成一个简单句子SentenceNode 并将该句子压入栈中
                String word1 = words[i];
                direction = new DirectionNode(word1);
                String word2 = words[++i];
                action = new ActionNode(word2);
                String word3 = words[++i];
                distance = new DistanceNode(word3);
                left = new SentenceNode(direction, action, distance);  // 左表达式
                stack.push(left);       // 将新表达式压入栈中
            }
        }
        this.node = (AbstractNode)stack.pop();  // 将全部表达式从栈中取出
    }

    public String output() {
        String result = node.interpret();   // 解释表达式
        return result;
    }
}
